/******************************************************************************* 
  Copyright (C), 1988-2020, zeno Tech. Co., Ltd.
  Description:      video-analyse公用头文件
  Function List:
      <wumj -- 2019-02-26>  创建
*******************************************************************************/
#ifndef ANALYSE_H 
#define ANALYSE_H  

#ifdef __cplusplus
extern "C" {
#endif

/*=============================================================================
                                 Includes                                  
==============================================================================*/

/*=============================================================================
                               Macro Definition
==============================================================================*/
                       
/*=============================================================================
                        Local Structures and Typedef 
==============================================================================*/

/* 算法平台类型 */
typedef enum
{
	ANALYSE_PLAT_NOR,                       /* 普通 */
	ANALYSE_PLAT_DG,                        /* 格灵深瞳 */
	ANALYSE_PLAT_HOR,                       /* 地平线 */
	ANALYSE_PLAT_YUFAN,                     /* 宇泛 */
	ANALYSE_PLAT_KUANGSHI,                     /* 旷世 */
}ANALYSE_platType_t;


/* 抓图类型 */
typedef enum
{
	ANALYSE_SNAP_HIGH,                      /* 大图 */
	ANALYSE_SNAP_LOW,                       /* 小图 */
	ANALYSE_SNAP_CROP,                      /* 抠图 */
}ANALYSE_snapType_t;


/* video基本信息 */
typedef struct
{
	int cpuType;	                         /* cpu类型,   见SYS_cpuType_t  */ 
	int resolution;                          /* 分辨率类型, 见VIDEO_resolution_t */ 
	int standard;                            /* 制式类型, 见VIDEO_standard_t */
	int plat;                                /* 算法平台, ANALYSE_platType_t */
	int rotate;                              /* 初始旋转状态 */
	int frmPrivLen;                          /* 帧信息中私有缓存大小 */
}ANALYSE_base_t;


/* 帧信息 */
typedef struct
{
	unsigned char *pVir;                    /* 虚拟地址 */
	unsigned long long phy;                 /* 物理地址 */
	unsigned int width;                     /* 款 */
	unsigned int height;                    /* 高 */
    unsigned int stride;                    /* 跨距 */
	unsigned long long pts;                 /* 时间戳 */
	void *pPriv;                            /* video私有数据 */
}ANALYSE_frame_t;


/* 帧信息 */
typedef struct
{
	ANALYSE_frame_t *pIvsFrame;              /* 算法帧 */
	ANALYSE_frame_t *pPicFrame;              /* 抓图帧 */
}ANALYSE_frames_t;


/* 抠图位置 */
typedef struct
{
	unsigned int left;
	unsigned int right;
	unsigned int top;
	unsigned int bottom;
}ANALYSE_crop_t;


/* 码流参数 */
typedef struct
{
	unsigned int width;
	unsigned int height;
}ANALYSE_streamPrms_t;


/* 抓图信息 */
typedef struct
{
	ANALYSE_frame_t *pFrame;                 /* 帧数据 */
	unsigned int type;                       /* 抓图类型 */
	unsigned int quality;                    /* 抓图质量      取值1-6，值越大，质量越好 */
	unsigned int dstWidth;                   /* 目标宽 */
	unsigned int dstHeight;                  /* 目标高 */
	ANALYSE_crop_t crop;                     /* 抠图时的位置 */
}ANALYSE_snapPrm_t;


/* 抓图数据 */
typedef struct
{
	unsigned char *pData;
	unsigned int len;
}ANALYSE_jpegData_t;

/// 数据类型
typedef enum
{
	cropYuv,		///< Yuv420sp
	cropBgr,		///< Bgr888
} AnalyseType;


/* 扣图数据 */
typedef struct
{
	ANALYSE_frame_t *pFrame;                 /* 帧数据 */
	ANALYSE_crop_t crop;                     /* 抠图位置 */
    int croptype;                            /* 抠图后输出的图片类型 */
}ANALYSE_cropPrm_t;


/* 扣图数据 */
typedef struct
{
	unsigned char *pData;                    /* 数据 */
	unsigned int len;                        /* 数据长度 */
	unsigned int width;                      /* 目标宽 */
	unsigned int height;                     /* 目标高 */
}ANALYSE_yuvData_t;


/* 缩放 */
typedef struct
{  
    ANALYSE_frame_t *pFrame;                 /* 原始图像信息 */
    unsigned int width;                      /* 目标表图像宽 */
    unsigned int height;                     /* 目标图像高 */
    unsigned long long phy;                  /* 目标图像物理地址 */
    unsigned char *pVir;                     /* 目标图像虚拟地址  */
}ANALYSE_scale_t;

/* 图像格式转换模式 */ 
typedef enum
{
	ANALYSE_YUV2BGR,						 /* YUV转BGR */
} ANALYSE_TransformType_t;

/* 帧信息 */
typedef struct
{
	unsigned char *pVir;                    /* 虚拟地址 */
	unsigned long long phy;                 /* 物理地址 */
	unsigned int width;                     /* 宽 */
	unsigned int height;                    /* 高 */
    unsigned int stride;                    /* 跨距 */
}ANALYSE_rawFrame_t;

/* 视频格式转换结构体 */
typedef struct
{  
    int formatType;                          /* 视频格式转换类型，详见ANALYSE_TransformType_t */
    ANALYSE_rawFrame_t srcFrame;             /* 源图像帧信息 */
    unsigned long long dstPhy;               /* 目标图像物理地址 */
    unsigned char *pDstVir;             	 /* 目标图像虚拟地址  */
}ANALYSE_transform_t;

/* 标题数据类型 */
typedef enum
{
	ANALYSE_STRING,		/* 字符串 */
	ANALYSE_BITMAP,		/* 位图 */
} Analyse_titleType_t;

/* 颜色 */
typedef struct
{
	unsigned char r;
	unsigned char g;
	unsigned char b;
	unsigned char a;
}ANALYSE_color_t;

typedef struct
{
    int enable;                 /* 是否显示,0-不显示，1-显示 */
    int index;                  /* 标题序号 */
    int type;                   /* 标题数据类型,详见Analyse_titleType_t */
	int  x;	                    /* 标题左上角x坐标 */	
	int  y;                     /* 标题左上角y坐标 */			
	int  width;		            /* 标题宽度 */
	int  height;	            /* 标题高度 */	
	ANALYSE_color_t	fgColor;    /* 前景颜色 */
	ANALYSE_color_t	bgColor;    /* 背景颜色 */
	unsigned char *pData;       /* 标题数据 */
}ANALYSE_title_t;

/* 视频接口信息 */
typedef struct ANALYSE_video_t
{
	void *priv;
    int cpuType;	                         /* cpu类型,   见SYS_cpuType_t  */ 
	int resolution;                          /* 分辨率类型, 见VIDEO_resolution_t */ 
	int standard;                            /* 制式类型, 见VIDEO_standard_t */
	int plat;                                /* 算法平台, ANALYSE_platType_t */
	int rotate;                              /* 初始旋转状态 */
	int frmPrivLen;                          /* 帧信息中私有缓存大小 */

    /***************************************************************************
      Description:  获取数据
      Input:        - pThiz: 接口指针
                    - type: 类型
                    - pFrame: 帧数据
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pGetFrame)(struct ANALYSE_video_t *pThiz, ANALYSE_frames_t *pFrames);

    /***************************************************************************
      Description:  释放数据
      Input:        - pThiz: 接口指针
                    - pFrame: 帧数据
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/	
	int (*pPutFrame)(struct ANALYSE_video_t *pThiz, ANALYSE_frames_t *pFrames);

    /***************************************************************************
      Description:  申请内存
      Input:        - pThiz: 接口指针
      				- pPhy: 物理地址
                    - ppVir: 虚拟地址
                    - len: 长度
                    - pName: 名称
                    - cache: 是否cache类型
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pAllocMem)(struct ANALYSE_video_t *pThiz,
	                  unsigned long long *pPhy,
	                  void **ppVir,
	                  int len,
	                  char *pName,
	                  int cache);

    /***************************************************************************
      Description:  释放内存
      Input:        - pThiz: 接口指针
      				- phy: 物理地址
                    - pVir: 虚拟地址
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pFreeMem)(struct ANALYSE_video_t *pThiz, unsigned long long phy, void *pVir);

    /***************************************************************************
      Description:  启动码流
      Input:        - pThiz: 接口指针
      				- pPrms: 参数
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pStartStream)(struct ANALYSE_video_t *pThiz, ANALYSE_streamPrms_t *pPrms);

    /***************************************************************************
      Description:  停止码流
      Input:        - pThiz: 接口指针
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pStopStream)(struct ANALYSE_video_t *pThiz);

    /***************************************************************************
      Description:  jpeg抓图
      Input:        - pThiz: 接口指针
      				- pPrm: 抓图参数
      				- pData: 抓图数据
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pSnapJpeg)(struct ANALYSE_video_t *pThiz,
	                 ANALYSE_snapPrm_t *pPrm,
	                 ANALYSE_jpegData_t *pData);

    /***************************************************************************
      Description:  yuv抠图
      Input:        - pThiz: 接口指针
      				- pPrm: 扣图参数
      				- pData: 扣图数据
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pCropYuv)(struct ANALYSE_video_t *pThiz,
	                ANALYSE_cropPrm_t *pPrm,
	                ANALYSE_yuvData_t *pData);

	/***************************************************************************
      Description:  帧缩放
      Input:        - pThiz: 接口指针
      				- pPrm: 缩放参数
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pScale)(struct ANALYSE_video_t *pThiz, ANALYSE_scale_t *pPrms);

	/***************************************************************************
      Description:  销毁接口
      Input:        - pThiz: 接口指针
      Output:       无
      Return:       0: 操作成功
                   	<0: 操作失败
      Others:       无
    ***************************************************************************/
	int (*pExit)(struct ANALYSE_video_t *pThiz);

    /***************************************************************************
    Description:  视频格式转换
    Input:        - pThiz: 接口指针
    			  - pPrm: 转换参数
    Output:       无
    Return:       0: 操作成功
           	      <0: 操作失败
    Others:       无
    ***************************************************************************/
    int (*pVideoTransform)(struct ANALYSE_video_t *pThiz, ANALYSE_transform_t *pPrms);

    /*******************************************************************************
     Function:     ANALYSE_SetFps
     Description:  获取帧数据
     Input:        - pThiz: 接口指针
     Output:       - fps: 帧率
     Return:       0: 操作成功
                   <0: 操作失败
     Others:       无
    *******************************************************************************/
    int (*pSetFps)(struct ANALYSE_video_t *pThiz, float fps);

    /*******************************************************************************
     Function:     pSetTitle
     Description:  设置标题
     Input:        - pThiz: 接口指针
                   - pTitle: 标题信息结构体指针
     Output:       无
     Return:       0: 操作成功
                   <0: 操作失败
     Others:       无
    *******************************************************************************/
    int (*pSetTitle)(struct ANALYSE_video_t *pThiz, ANALYSE_title_t *pTitle);
}ANALYSE_video_t;

/*=============================================================================
                             extern  Variables                                  
==============================================================================*/

/*=============================================================================
                             Function Definition                                  
==============================================================================*/ 

/*******************************************************************************
  Function:     ANALYSE_VideoInit
  Description:  video接口初始化
  Input:        - ppVideo: 视频接口
  Output:       无
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/
int ANALYSE_VideoInit(ANALYSE_video_t **ppVideo);

#ifdef __cplusplus
}
#endif
#endif // ANALYSE_H 


